/* 信号基础篇 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>

//设置全局变量
int second;
union sigval sig_val;
int pid_user;    //等待接收的进程
int sig_user;    //待发送的信号
sigset_t sig_set;

//定时器处理函数 --> SIGALRM信号 --> 发送sig信号
static void alarm_handle(int sig) 
{ 
    /* 发送 sig 信号 */
    sig_val.sival_int = 10; //伴随数据 
    if (-1 == sigqueue(pid_user, sig_user, sig_val)) { 
        perror("sigqueue error"); 
        exit(-1); 
    } 
    puts("信号发送成功!");
    alarm(second);
} 

int main(int argc,char **argv)
{
    /* 检验传参个数 */ 
    if (4 > argc) 
        exit(-1); 

    second = atoi(argv[1]);
    pid_user = atoi(argv[2]);
    sig_user = atoi(argv[3]);
    printf("pid: %d\nsignal: %d\n", pid_user, sig_user);

    struct sigaction sig = {0};
    sig.sa_flags = 0;
    sig.sa_handler = alarm_handle;

    /* 将信号集初始化为空 */ 
    sigemptyset(&sig_set);
    /* 注册信号处理函数 */
    if(-1 == sigaction(SIGALRM,&sig,NULL)) {
        perror("sigaction error");
        exit(-1);
    }
    /* 开启alarm定时器 */
    second = atoi(argv[1]);
    printf("设置定时时长为: %ds\n",second);
    alarm(second);

    for(;;) {
        usleep(1000 * 500);
    }

    exit(0);
}